package array;

//找出仅出现一次的数字
public class OnceNum {

	public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array==null||array.length<2){
            return ;
        }
        int xORResult=0; //用以存储亦或的结果
        for(int i=0;i<array.length;i++){
            xORResult^=array[i];
        }
        //找到第一个不为0的位
        int indexOf1=findBitOf1(xORResult);
        num1[0]=num2[0]=0;
        for(int i=0;i<array.length;i++){
            if(isBit1(array[i],indexOf1)){
                num1[0]^=array[i];
            }
            else{
                num2[0]^=array[i];
            }
        }
    }
    //找出亦或的二进制中第一位为1的位数m
    public int findBitOf1(int xOrResult){
        int count=0;
        //右起第一位为0
        while((xOrResult&1)==0){
            xOrResult=xOrResult>>1;
            count++;
        }
        return count;
    }
    //判断数组中m位为1的数
    //num表示数，m表示位为1的位数
    public boolean isBit1(int num,int m){
        num=num>>m;
        return (num&1)==1;
    }
}
